let id = 0

/**
 * Dep 也是一个构造函数 可以把他理解为观察者模式里面的被观察者
 *
 * Dep 和 Watcher 是多对多的关系
 *
 * 每个属性都有自己的dep
 */
export default class Dep {
  constructor() {
    this.id = id++
    // 在 subs 里面收集 watcher 当数据变动的时候通知自身 subs 所有的 watcher 更新
    this.subs = [] // 这个是存放watcher的容器
  }

  depend() {
    // 如果当前存在 watcher
    if (Dep.target) {
      Dep.target.addDep(this) // 把自身-dep实例存放在watcher里面
    }
  }

  notify() {
    this.subs.forEach((watcher) => watcher.update())
  }

  addSub(watcher) {
    this.subs.push(watcher)
  }
}

// Dep.target 是一个全局 Watcher 指向 初始状态是 null
Dep.target = null

// 栈结构用来存watcher
const targetStack = []

export function pushTarget(watcher) {
  targetStack.push(watcher)
  Dep.target = watcher // Dep.target指向当前watcher
}

export function popTarget() {
  targetStack.pop()
  Dep.target = targetStack[targetStack.length - 1]
}
